//
// Created by denglibin on 2021/8/19.
//每个HttpController类可以定义多个Http请求处理函数(handler)，由于函数数目可以任意多，所以通过虚函数重载是不现实的，
// 我们需要把处理函数本身(而不是类)注册到框架里去。
//{}: 表示这个路径参数映射到处理函数的对应位置上，路径上的位置就是函数参数的位置。
//{1},{2}: 中间有个数字的，表示映射到数字指定的处理函数参数上。
//{anystring}: 中间的字符串没有实际作用，但可以提高程序的可读性，与{}等价。
//{1:anystring},{2:xxx}: 冒号前的数字表示位置，后面的字符串没有实际作用，但可以提高程序的可读性，与{1},{2}等价。

#ifndef HELLO_DROGON_USERCONTROLLER_H
#define HELLO_DROGON_USERCONTROLLER_H
#include <iostream>
#include <drogon/HttpController.h>

using  namespace  std;
using namespace  drogon;
namespace  user{
    class UserController : public HttpController<UserController>{
    public:

       METHOD_LIST_BEGIN
            //METHOD_ADD宏会在路径映射中自动把名字空间和类名作为路径的前缀
            //login函数，被注册到了/user/UserController/token路径上
            METHOD_ADD(UserController::login,"/token?userId={1}&passwd={2}",Post);
            METHOD_ADD(UserController::getInfo,"/{1}/info?token={2}",Get); //http://localhost:8089/user/UserController/1234/info
        METHOD_LIST_END
        UserController();
        ~UserController();
        void login(const HttpRequestPtr &req,
                   std::function<void (const HttpResponsePtr &)> &&callback,
                   std::string &&userId,
                   const std::string &password);
        void getInfo(const HttpRequestPtr &req,
                     std::function<void (const HttpResponsePtr &)> &&callback,
                     std::string userId,
                     const std::string &token) const;
    };

}


#endif //HELLO_DROGON_USERCONTROLLER_H
